/**
 * Create by CaoWenjian
 *
 * @copyRight: 2018
 **/
package com.bjboot.caocao.common.utils;

import com.bjboot.caocao.common.config.Constant;
import com.bjboot.caocao.system.domain.Tree;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *@Description 构建树的工具
 *@Author 操文健
 *@Date 2018-09-05 下午2:15
 *@Version 1.0
 **/
public class BuildTreeUtil {

    /**
     * 将list的树形集合进行整理，根据当前系统自定义顶级节点等
     * @param nodes
     * @param <T>
     * @return
     */
    public static <T> Tree<T> build(List<Tree<T>> nodes) {

        if (nodes == null) {
            return null;
        }

        List<Tree<T>> topNodes = new ArrayList<Tree<T>>();
        for (Tree<T> node : nodes) {
            // 获取父节点
            String pid = node.getParentId();
            // 默认的父节点为空或者父节点为0
            if (pid == null || "0".equals(pid)) {
                topNodes.add(node);
                continue;
            }
            // 如果不是顶级节点，则就循环进行寻找该节点的父节点
            for (Tree<T> parentNode : nodes) {
                String curId = parentNode.getId();
                if (curId != null && pid.equals(curId)) {
                    parentNode.getChildren().add(node);
                    parentNode.setHasChildren(true);
                    node.setHasParent(true);
                    continue;
                }
            }
        }

        // 开始组装返回的跟节点信息
        Tree<T> root = new Tree<T>();
        // 如果只有一个父节点，则就返回当前的节点
        if (topNodes.size() == 1) {
            root = topNodes.get(0);
        } else {
            root.setId("-1");
            root.setParentId("");
            root.setHasParent(false);
            root.setHasChildren(true);
            root.setChecked(true);
            root.setChildren(topNodes);
            root.setText(Constant.DEPT_ROOT_NAME);
            Map<String, Object> state = new HashMap<>(16);
            state.put("opened", true);
            root.setState(state);
        }

        return root;
    }

    /**
     * 根据tree的list进行构建树形结构信息
     * @param nodes
     * @param idParam
     * @return
     */
    public static <T> List<Tree<T>> buildList(List<Tree<T>> nodes, String idParam) {
        if (nodes == null) {
            return null;
        }
        List<Tree<T>> topNodes = new ArrayList<Tree<T>>();

        for (Tree<T> children : nodes) {
            String pid = children.getParentId();
            if (pid == null || idParam.equals(pid)) {
                topNodes.add(children);

                continue;
            }

            for (Tree<T> parent : nodes) {
                String id = parent.getId();
                if (id != null && id.equals(pid)) {
                    parent.getChildren().add(children);
                    children.setHasParent(true);
                    parent.setHasChildren(true);

                    continue;
                }
            }
        }
        return topNodes;
    }
}
